package com.zx.练习题._2022面试题;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;

public class Demo1 {

    /**
     * 一个数组,举例为 [1,2,1,3,5,6,5,7,6,1] ；
     *  1、输出没有重复出现的元素[2,3,7]
     *  2、按出现频率倒序排序并输出[1,5,6]
     *
     * @param args
     */
    public static void main(String[] args) {
        int[] arr = {1, 2, 1, 3, 5, 6, 5, 7, 6, 1, 11, 11, 999, 999, 999, 999};
        fun1(arr);

    }

    private static void fun1(int[] arr) {
        // 使用hashmap，key=数组，value=次数
        Map<Integer, Integer> map = new HashMap<>();
        for (int i : arr) {
            if (!map.containsKey(i)) {
                map.put(i, 1);
            } else {
                map.put(i, map.get(i) + 1);
            }
        }

        List<Integer> noReplace = map.entrySet().stream().filter(e -> e.getValue() <= 1).map(Entry::getKey)
                .collect(Collectors.toList());

        System.out.println("不重复的=" + noReplace);

        // 1.直接调用list的排序算法比较数字
        List<Integer> replace = map.entrySet().stream()
                .filter(e -> e.getValue() > 1)
                .sorted((a, b) -> a.getValue().compareTo(b.getValue()))
                .map(Entry::getKey)
                .collect(Collectors.toList());
        System.out.println("1. 重复的=" + replace);

        // 2.自定义排序算法[冒泡]
        Entry<Integer, Integer>[] array = map.entrySet()
                .stream()
                .filter(e -> e.getValue() > 1)
                .toArray(Entry[]::new);

        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j].getValue() > array[j + 1].getValue()) {
                    Entry t = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = t;
                }
            }
        }

        Integer[] array1 = Arrays.stream(array).map(Entry::getKey).toArray(Integer[]::new);

        System.out.println("2. 重复的=" + Arrays.toString(array1));
    }

}
